package cc.magicjson.example.demo.exam;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 利用jdk 17、fastjson-1.2.83 实现输入数据转换为层次化的 JSON 结构
 * <p>
 * {@link JSONObject}
 * {@link JSONArray}
 *
 * @author <a href="mailto:it_magicjson@163.com">MagicJson</a>
 * @since 1.0.0
 */
public class FastJsonConverter {

	private static final String CHILDREN = "children";
	private static final String kEY = "key";

	/**
	 * 将输入数据转换为层次化的 JSON 结构
	 *
	 * @param inputList 输入的 JSON 对象列表
	 * @return 转换后的层次化 JSON 对象
	 */
	public static JSONObject convertToHierarchicalJson(List<Map<String, Object>> inputList) {
		Map<Integer, JSONObject> map = new HashMap<>();
		JSONObject root = null;

		// 初始化所有节点
		for (Map<String, Object> data : inputList) {
			// 使用新建的 HashMap 来确保 JSONObject 是可修改的
			Map<String, Object> modifiableData = new HashMap<>(data);
			JSONObject node = new JSONObject(modifiableData);
			node.put(CHILDREN, new JSONArray());
			map.put((Integer) data.get(kEY), node);
		}

		// 构建树结构
		for (Map<String, Object> data : inputList) {
			Integer key = (Integer) data.get(kEY);
			// 通过简单的除法操作，确定每个节点的父节点
			int parentKey = key / 10;
			if (parentKey == 0) {
				root = map.get(key);
			} else {
				map.get(parentKey).getJSONArray(CHILDREN).add(map.get(key));
			}
		}

		return root;
	}

	public static void main(String[] args) {
		// 使用 ArrayList 来创建可变的输入数据列表
		List<Map<String, Object>> inputList = new ArrayList<>();
		inputList.add(new HashMap<>(Map.of(kEY, 1, "value", "alibaba")));
		inputList.add(new HashMap<>(Map.of(kEY, 11, "value", "aliyun")));
		inputList.add(new HashMap<>(Map.of(kEY, 111, "value", "gts")));
		inputList.add(new HashMap<>(Map.of(kEY, 112, "value", "cse")));
		inputList.add(new HashMap<>(Map.of(kEY, 12, "value", "taotian")));
		inputList.add(new HashMap<>(Map.of(kEY, 121, "value", "tmall")));

		// 调用方法转换为层次化 JSON 结构
		JSONObject result = convertToHierarchicalJson(inputList);
		// 输出 JSON 字符串
		System.out.println(result.toJSONString());
	}
}
